package com.lcn.netty.initializer;

import com.lcn.netty.handler.ChatHandler;
import com.lcn.netty.handler.HeartBeatHandler;
import com.lcn.netty.handler.HttpHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;
import io.netty.handler.timeout.IdleStateHandler;

/**
 * 初始化器
 */
public class WebSocketServerInitializer extends ChannelInitializer<SocketChannel> {

    @Override
    protected void initChannel(SocketChannel socketChannel) throws Exception {
        // 通过socket获得对应的管道
        ChannelPipeline pipeline = socketChannel.pipeline();
        // 通过管道添加handler处理器
        pipeline.addLast(new HttpServerCodec());
        // 大数据流支持
        pipeline.addLast(new ChunkedWriteHandler());
        // 对httpMessage进行聚合
        pipeline.addLast(new HttpObjectAggregator(1024 * 64));
        // =============== 以上用于支持http协议相关的处理器 ===============

        // =============== 心跳支持 start ===============
        // 1分钟内没有向服务端发送读写心跳(ALL)则主动断开连接
        // 如果是读空闲或写空闲则不做任何处理
        pipeline.addLast(new IdleStateHandler(10 * 60, 10 * 60, 300 * 60));
        pipeline.addLast(new HeartBeatHandler());
        // =============== 心跳支持 end ===============

        // =============== 以下用于支持websocket相关的处理器 ===============
        // websocket服务器处理的协议，指定客户端连接的路由 /ws
        pipeline.addLast(new WebSocketServerProtocolHandler("/ws"));
        // 添加自定义的助手类
        pipeline.addLast(new ChatHandler());
    }

}
